/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.clinicsolution.persistencia.dao.impl;

import br.com.clinicsolution.persistencia.conexao.FabricaConexao;
import br.com.clinicsolution.persistencia.dao.PacienteDao;
import br.com.clinicsolution.persistencia.model.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Patricia Rocheulle
 */
public class PacienteDaoImpl implements PacienteDao {

    @Override
    public Boolean salvar(Paciente paciente) {
        Boolean result = true;
        Connection conexao = null;
        PreparedStatement p = null;

        String dataDefault = "1970-01-01";
        //String insert = "INSERT INTO CLINICSOLUTION.PACIENTE (NOME, APELIDO, RG, DAT_EMISSAO_RG, ORG_EMISSOR, DAT_NASCIMENTO, SEXO, COD_COR, COD_ESTADO_CIVIL, IDADE, NOM_MAE, END_RESIDENCIAL, NUMERO, BAIRRO, CEP, COD_CIDADE, COD_UF, TEL_RESIDENCIAL, CEL_1, EMAIL, COD_PROFISSAO, COD_CONVENIO, COD_PLANO, VAL_CARTEIRA, CPF) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        String insert = "INSERT INTO CLINICSOLUTION.PACIENTE (NOME, APELIDO, RG, DAT_EMISSAO_RG, ORG_EMISSOR, DAT_NASCIMENTO, SEXO, COD_COR, COD_ESTADO_CIVIL, IDADE, NOM_MAE, END_RESIDENCIAL, NUMERO, BAIRRO, CEP, COD_CIDADE, COD_UF, TEL_RESIDENCIAL, CEL_1, EMAIL, COD_PROFISSAO, COD_CONVENIO, COD_PLANO, VAL_CARTEIRA, NOM_PAI, COMPLEMENTO, TEL_RECADO, CONTATO, TEL_COMERCIAL, CEL_2, CEL_3, CEL_4, OBSERVACAO, CPF) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        //String update = "UPDATE CLINICSOLUTION.PACIENTE SET NOME = ?, APELIDO = ?, RG = ?, DAT_EMISSAO_RG = ?, ORG_EMISSOR = ?, DAT_NASCIMENTO = ?, SEXO = ?, COD_COR = ?, COD_ESTADO_CIVIL = ?, IDADE = ?, NOM_MAE = ?, END_RESIDENCIAL = ?, NUMERO = ?, BAIRRO = ?, CEP = ?, COD_CIDADE = ?, COD_UF = ?, TEL_RESIDENCIAL = ?, CEL_1 = ?, EMAIL = ?, COD_PROFISSAO = ?, COD_CONVENIO = ?, COD_PLANO = ?, VAL_CARTEIRA = ? WHERE CPF = ?";
        String update = "UPDATE CLINICSOLUTION.PACIENTE SET NOME = ?, APELIDO = ?, RG = ?, DAT_EMISSAO_RG = ?, ORG_EMISSOR = ?, DAT_NASCIMENTO = ?, SEXO = ?, COD_COR = ?, COD_ESTADO_CIVIL = ?, IDADE = ?, NOM_MAE = ?, END_RESIDENCIAL = ?, NUMERO = ?, BAIRRO = ?, CEP = ?, COD_CIDADE = ?, COD_UF = ?, TEL_RESIDENCIAL = ?, CEL_1 = ?, EMAIL = ?, COD_PROFISSAO = ?, COD_CONVENIO = ?, COD_PLANO = ?, VAL_CARTEIRA = ?, NOM_PAI = ?, COMPLEMENTO = ?, TEL_RECADO = ?, CONTATO = ?, TEL_COMERCIAL = ?, CEL_2 = ?, CEL_3 = ?, CEL_4 = ?, OBSERVACAO = ? WHERE CPF = ?";
        try {
            conexao = FabricaConexao.getConexao();
            p = conexao.prepareStatement(((consultar(paciente.getCpf()) == null) ? insert : update));
            p.setString(1, paciente.getNome());
            p.setString(2, paciente.getApelido());
            p.setString(3, paciente.getRg());
            if (paciente.getDataEmissao() != null) {
                p.setString(4, paciente.getDataEmissao().toString());
            } else {
                p.setString(4, dataDefault);
            }
            p.setString(5, paciente.getOrgaoEmissor());
            if (paciente.getDataNascimento() != null) {
                p.setString(6, paciente.getDataNascimento().toString());
            } else {
                p.setString(6, dataDefault);
            }
            p.setString(7, paciente.getSexo());
            if (paciente.getCodCor() != null) {
                p.setInt(8, paciente.getCodCor());
            } else {
                p.setInt(8, 1);
            }
            if (paciente.getCodEstadoCivil() != null) {
                p.setInt(9, paciente.getCodEstadoCivil());
            } else {
                p.setInt(9, 1);
            }
            if (paciente.getIdade() != null) {
                p.setInt(10, paciente.getIdade());
            } else {
                p.setInt(10, 1);
            }
            p.setString(11, paciente.getNomeMae());
            p.setString(12, paciente.getEndResidencial());
            p.setString(13, paciente.getNumero());
            p.setString(14, paciente.getBairro());
            p.setString(15, paciente.getCep());
            if (paciente.getCodCidade() != null) {
                p.setInt(16, paciente.getCodCidade());
            } else {
                p.setInt(16, 1);
            }
            if (paciente.getCodUf() != null) {
                p.setInt(17, paciente.getCodUf());
            } else {
                p.setInt(17, 1);
            }
            p.setString(18, paciente.getTelResidencial());
            p.setString(19, paciente.getCel1());
            p.setString(20, paciente.getEmail());
            if (paciente.getCodProfissao() != null) {
                p.setInt(21, paciente.getCodProfissao());
            } else {
                p.setInt(21, 1);
            }
            if (paciente.getCodConvenio() != null) {
                p.setInt(22, paciente.getCodConvenio());
            } else {
                p.setInt(22, 1);
            }
            if (paciente.getCodPlano() != null) {
                p.setInt(23, paciente.getCodPlano());
            } else {
                p.setInt(23, 1);
            }
            if (paciente.getValidadeCarteira() != null) {
                p.setString(24, paciente.getValidadeCarteira().toString());
            } else {
                p.setString(24, dataDefault);
            }
            
            p.setString( 25, paciente.getNomePai());
            p.setString( 26, paciente.getComplemento());
            p.setString( 27, paciente.getTelRecado());
            p.setString( 28, paciente.getContato());
            p.setString( 29, paciente.getTelComercial());
            p.setString( 30, paciente.getCel2());
            p.setString( 31, paciente.getCel3());
            p.setString( 32, paciente.getCel4());
            p.setString( 33, paciente.getObservacao());
            
            p.setString(34, paciente.getCpf());

            p.execute();
        } catch (Exception e) {
            result = false;
            System.out.println(e.getMessage());
        } finally {
            try {
                p.close();
                conexao.close();
            } catch (Exception e) {
            }
        }
        return result;
    }

    @Override
    public Paciente consultar(String cpf) {
        Connection conexao = null;
        PreparedStatement p = null;
        ResultSet r = null;
        Paciente pacienteVO = null;
        try {
            conexao = FabricaConexao.getConexao();
            //62098713304
            p = conexao.prepareStatement("select cpf, nome, apelido, rg, dat_emissao_rg, org_emissor, dat_nascimento, sexo, cod_cor, cod_estado_civil, idade, nom_mae, nom_pai, end_residencial, numero, bairro, complemento, cep, cod_cidade, cod_uf, tel_residencial, tel_recado, contato, tel_comercial, cel_1, cel_2, cel_3, cel_4, email, cod_profissao, cod_convenio, cod_plano, val_carteira, observacao from clinicsolution.paciente where cpf = ?");
            p.setString(1, cpf);
            r = p.executeQuery();

            if (r != null) {
                while (r.next()) {
                    pacienteVO = new Paciente();
                    pacienteVO.setApelido(r.getString("apelido"));
                    pacienteVO.setBairro(r.getString("bairro"));
                    pacienteVO.setCel1(r.getString("cel_1"));
                    pacienteVO.setCel2(r.getString("cel_2"));
                    pacienteVO.setCel3(r.getString("cel_3"));
                    pacienteVO.setCel4(r.getString("cel_4"));
                    pacienteVO.setCep(r.getString("cep"));
                    pacienteVO.setCodCidade(r.getInt("cod_cidade"));
                    pacienteVO.setCodConvenio(r.getInt("cod_convenio"));
                    pacienteVO.setCodCor(r.getInt("cod_cor"));
                    pacienteVO.setCodEstadoCivil(r.getInt("cod_estado_civil"));
                    pacienteVO.setCodPlano(r.getInt("cod_plano"));
                    pacienteVO.setCodProfissao(r.getInt("cod_profissao"));
                    pacienteVO.setCodUf(r.getInt("cod_uf"));
                    pacienteVO.setComplemento(r.getString("complemento"));
                    pacienteVO.setContato(r.getString("complemento"));
                    pacienteVO.setCpf(r.getString("cpf"));
                    pacienteVO.setDataEmissao(r.getDate("dat_emissao_rg"));
                    pacienteVO.setDataNascimento(r.getDate("dat_nascimento"));
                    pacienteVO.setEmail(r.getString("email"));
                    pacienteVO.setEndResidencial(r.getString("end_residencial"));
                    pacienteVO.setIdade(r.getInt("idade"));
                    pacienteVO.setNome(r.getString("nome"));
                    pacienteVO.setNomeMae(r.getString("nom_mae"));
                    pacienteVO.setNomePai(r.getString("nom_pai"));
                    pacienteVO.setNumero(r.getString("numero"));
                    pacienteVO.setObservacao(r.getString("observacao"));
                    pacienteVO.setOrgaoEmissor(r.getString("org_emissor"));
                    pacienteVO.setRg(r.getString("rg"));
                    pacienteVO.setSexo(r.getString("sexo"));
                    pacienteVO.setTelComercial(r.getString("tel_comercial"));
                    pacienteVO.setTelRecado(r.getString("tel_recado"));
                    pacienteVO.setContato(r.getString("contato"));
                    pacienteVO.setTelResidencial(r.getString("tel_residencial"));
                    pacienteVO.setValidadeCarteira(r.getDate("val_carteira"));
                }
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                r.close();
                p.close();
                conexao.close();
            } catch (Exception e) {
            }
        }
        return pacienteVO;
    }

    // ============================================================================================
    // consultas auxiliares que serão usadas para carregar os dados da tela de cadastro de paciente
    // ============================================================================================
    @Override
    public List<Profissao> listarProfissoes() {
        Connection conexao = null;
        PreparedStatement p = null;
        ResultSet r = null;
        List<Profissao> listaProfissoes = null;
        try {
            conexao = FabricaConexao.getConexao();
            //62098713304
            p = conexao.prepareStatement("select cod_profissao, des_profissao from profissao");
            r = p.executeQuery();

            if (r != null) {
                listaProfissoes = new ArrayList<Profissao>();
                while (r.next()) {
                    listaProfissoes.add(new Profissao(r.getInt("cod_profissao"), r.getString("des_profissao")));
                }
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                r.close();
                p.close();
                conexao.close();
            } catch (Exception e) {
            }
        }
        return listaProfissoes;
    }

    @Override
    public List<CorPessoa> listarCorPessoa() {
        Connection conexao = null;
        PreparedStatement p = null;
        ResultSet r = null;
        List<CorPessoa> listaCores = null;
        try {
            conexao = FabricaConexao.getConexao();
            p = conexao.prepareStatement("select cod_cor, des_cor from cor_pessoa");
            r = p.executeQuery();

            if (r != null) {
                listaCores = new ArrayList<CorPessoa>();
                while (r.next()) {
                    listaCores.add(new CorPessoa(r.getInt("cod_cor"), r.getString("des_cor")));
                }
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                r.close();
                p.close();
                conexao.close();
            } catch (Exception e) {
            }
        }
        return listaCores;
    }

    @Override
    public List<Cidade> listarCidades() {
        Connection conexao = null;
        PreparedStatement p = null;
        ResultSet r = null;
        List<Cidade> litasCidades = null;
        try {
            conexao = FabricaConexao.getConexao();
            p = conexao.prepareStatement("select cod_uf, cod_cidade, des_cidade from cidade");
            r = p.executeQuery();

            if (r != null) {
                litasCidades = new ArrayList<Cidade>();
                while (r.next()) {
                    litasCidades.add(new Cidade(r.getInt("cod_uf"), r.getInt("cod_cidade"), r.getString("des_cidade")));
                }
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                r.close();
                p.close();
                conexao.close();
            } catch (Exception e) {
            }
        }
        return litasCidades;
    }

    @Override
    public List<Uf> listarUF() {
        Connection conexao = null;
        PreparedStatement p = null;
        ResultSet r = null;
        List<Uf> listaUf = null;
        try {
            conexao = FabricaConexao.getConexao();
            p = conexao.prepareStatement("select cod_uf, sgl_uf, des_uf from uf");
            r = p.executeQuery();

            if (r != null) {
                listaUf = new ArrayList<Uf>();
                while (r.next()) {
                    listaUf.add(new Uf(r.getInt("cod_uf"), r.getString("sgl_uf"), r.getString("des_uf")));
                }
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                r.close();
                p.close();
                conexao.close();
            } catch (Exception e) {
            }
        }
        return listaUf;
    }

    @Override
    public List<Plano> listarPlano() {
       Connection conexao = null;
        PreparedStatement p = null;
        ResultSet r = null;
        List<Plano> listaPlanos = null;
        try {
            conexao = FabricaConexao.getConexao();
            p = conexao.prepareStatement("select cod_plano, cod_convenio, des_plano from plano");
            r = p.executeQuery();

            if (r != null) {
                listaPlanos = new ArrayList<Plano>();
                while (r.next()) {
                    listaPlanos.add(new Plano(r.getInt("cod_plano"), r.getInt("cod_convenio"), r.getString("des_plano")));
                }
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                r.close();
                p.close();
                conexao.close();
            } catch (Exception e) {
            }
        }
        return listaPlanos;
    }
    
    @Override
    public List<Convenio> listarConvenio() {
               Connection conexao = null;
        PreparedStatement p = null;
        ResultSet r = null;
        List<Convenio> litasConvenio = null;
        try {
            conexao = FabricaConexao.getConexao();
            p = conexao.prepareStatement("select cod_convenio, des_convenio from convenio");
            r = p.executeQuery();

            if (r != null) {
                litasConvenio = new ArrayList<Convenio>();
                while (r.next()) {
                    litasConvenio.add(new Convenio(r.getInt("cod_convenio"), r.getString("des_convenio")));
                }
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                r.close();
                p.close();
                conexao.close();
            } catch (Exception e) {
            }
        }
        return litasConvenio;
    }
    
    @Override
    public List<EstadoCivil> listarEstadoCivil() {
               Connection conexao = null;
        PreparedStatement p = null;
        ResultSet r = null;
        List<EstadoCivil> litasEstadoCivil = null;
        try {
            conexao = FabricaConexao.getConexao();
            p = conexao.prepareStatement("select cod_estado_civil, des_estado_civil from estado_civil");
            r = p.executeQuery();

            if (r != null) {
                litasEstadoCivil = new ArrayList<EstadoCivil>();
                while (r.next()) {
                    litasEstadoCivil.add(new EstadoCivil(r.getInt("cod_estado_civil"), r.getString("des_estado_civil")));
                }
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                r.close();
                p.close();
                conexao.close();
            } catch (Exception e) {
            }
        }
        return litasEstadoCivil;

    }
}
